package br.siseventos.managed;

import br.siseventos.model.*;
import br.siseventos.model.util.EnumHelper;
import br.siseventos.service.EventoService;
import br.siseventos.service.PublicoService;
import br.siseventos.service.RecursoService;
import br.siseventos.service.ServicoService;
import br.siseventos.service.TipoEventoService;
import br.siseventos.service.TipoRecursoService;
import br.siseventos.view.util.MessageHelper;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import org.primefaces.event.FlowEvent;

@ManagedBean(name = "novoEventoBean")
@ViewScoped
public class NovoEventoBean extends BaseBean {
    // Campos

    private TbEvento evento = new TbEvento();
    private List<TbRecurso> recursosDisponiveis = new ArrayList<TbRecurso>();
    private List<TbRecurso> recursosAlocados = new ArrayList<TbRecurso>();
    private List<TbServico> servicosDisponiveis = new ArrayList<TbServico>();
    private List<TbServico> servicosAlocados = new ArrayList<TbServico>();
    private List<TbPublico> publicos = new ArrayList<TbPublico>();
    private List<TaPedidoTipoRecurso> pedidoTipoRecursos = new ArrayList<TaPedidoTipoRecurso>();
    
    private TbServico servicoAdicionado = new TbServico();
    private TbRecurso recursoAdicionado = new TbRecurso();
    private int quantidadeRecursoAdicionado = 0;
    
    // Model properties
    String currentStepId;
    String nextStepId;
    // Component properties
    // Services
    private EventoService eventoService;
    private RecursoService recursoService;
    private ServicoService servicoService;
    private TipoEventoService tipoEventoService;
    private TipoRecursoService tipoRecursoService;
    private PublicoService publicoService;

    // Construtor
    public NovoEventoBean() {
        model();
    }

    // Action e listeners
    public void cadastrar(ActionEvent e) {
        try {

            // Mostrar mensagem de sucesso
            MessageHelper.showGlobalMessage("Cadastro realizado com sucesso.", FacesMessage.SEVERITY_ERROR);
        } catch (Exception ex) {
            // Mostrar mensagem de erro
            MessageHelper.showGlobalMessage("Erro ao cadastrar evento.", FacesMessage.SEVERITY_ERROR);
        }
    }

    public void onAddRecurso(TbRecurso recurso) {
        recursoAdicionado = recurso;
        // Excluindo da tabela de recursos disponiveis
        recursosDisponiveis.remove(recursoAdicionado);

        // Adicionando na tabela de recursos alocados
        recursosAlocados.add(recursoAdicionado);
        
        // Adicionando o registro de pedido do recurso
        pedidoTipoRecursos.add(new TaPedidoTipoRecurso(null, recursoAdicionado.getTdTipoRecurso(), 
                quantidadeRecursoAdicionado, EnumHelper.StatusAprovacao.AguardandoAprovacao.getStatusChar(), null));
    }

    public void onDelRecurso(TbRecurso recurso) {
        recursoAdicionado = recurso;
        // Excluindo da tabela de recursos alocados
        recursosAlocados.remove(recursoAdicionado);

        // Adicionando na tabela de recursos disponiveis
        recursosDisponiveis.add(recursoAdicionado);

    }
    
    public void onAddServico(TbServico servico){
        servicoAdicionado = servico;
        
        // Excluindo da tabela de recursos alocados
        servicosDisponiveis.remove(servicoAdicionado);

        // Adicionando na tabela de recursos disponiveis
        servicosAlocados.add(servicoAdicionado);
    }
    
    public void onDelServico(TbServico servico){
        servicoAdicionado = servico;
        
        // Excluindo da tabela de recursos alocados
        servicosAlocados.remove(servicoAdicionado);

        // Adicionando na tabela de recursos disponiveis
        servicosDisponiveis.add(servicoAdicionado);
    }
    // Component listeners

    public String onFlow(FlowEvent e) {
        // Buscando a etapa atual do Wizard
        currentStepId = e.getOldStep();
        nextStepId = e.getNewStep();
        if (nextStepId.compareTo("tabDadosEvento") == 0) {
        } else if (nextStepId.compareTo("tabRecursosEvento") == 0) {
        } else if (nextStepId.compareTo("tabServicosEvento") == 0) {
        } else {
        }


        return nextStepId;
    }

    // Getters e Setters
    public TbEvento getEvento() {
        return evento;
    }

    public void setEvento(TbEvento evento) {
        this.evento = evento;
    }

    public List<TbPublico> getPublicos() {
        return publicos;
    }

    public void setPublicos(List<TbPublico> publicos) {
        this.publicos = publicos;
    }

    public List<TbRecurso> getRecursosDisponiveis() {
        return recursosDisponiveis;
    }

    public void setRecursosDisponiveis(List<TbRecurso> recursosDisponiveis) {
        this.recursosDisponiveis = recursosDisponiveis;
    }

    public List<TbRecurso> getRecursosAlocados() {
        return recursosAlocados;
    }

    public void setRecursosAlocados(List<TbRecurso> recursosAlocados) {
        this.recursosAlocados = recursosAlocados;
    }

    public List<TbServico> getServicosAlocados() {
        return servicosAlocados;
    }

    public void setServicosAlocados(List<TbServico> servicosAlocados) {
        this.servicosAlocados = servicosAlocados;
    }

    public List<TbServico> getServicosDisponiveis() {
        return servicosDisponiveis;
    }

    public void setServicosDisponiveis(List<TbServico> servicosDisponiveis) {
        this.servicosDisponiveis = servicosDisponiveis;
    }

    public TbRecurso getRecursoAdicionado() {
        return recursoAdicionado;
    }

    public void setRecursoAdicionado(TbRecurso recursoAdicionado) {
        this.recursoAdicionado = recursoAdicionado;
    }

    public int getQuantidadeRecursoAdicionado() {
        return quantidadeRecursoAdicionado;
    }

    public void setQuantidadeRecursoAdicionado(int quantidadeRecursoAdicionado) {
        this.quantidadeRecursoAdicionado = quantidadeRecursoAdicionado;
    }
    
    
    // Lazy Loading Services
    public EventoService getEventoService() {
        if (eventoService == null) {
            eventoService = new EventoService();
        }
        return eventoService;
    }

    public PublicoService getPublicoService() {
        if (publicoService == null) {
            publicoService = new PublicoService();
        }
        return publicoService;
    }

    public RecursoService getRecursoService() {
        if (recursoService == null) {
            recursoService = new RecursoService();
        }
        return recursoService;
    }

    public ServicoService getServicoService() {
        if (servicoService == null) {
            servicoService = new ServicoService();
        }
        return servicoService;
    }

    public TipoEventoService getTipoEventoService() {
        if (tipoEventoService == null) {
            tipoEventoService = new TipoEventoService();
        }
        return tipoEventoService;
    }

    public TipoRecursoService getTipoRecursoService() {
        if (tipoRecursoService == null) {
            tipoRecursoService = new TipoRecursoService();
        }
        return tipoRecursoService;
    }

    // Static getters
    public List<TbServico> getListaServicos() {
        List<TbServico> s = null;
        try {
            s = getServicoService().consultarTodos();
        } catch (Exception e) {
        }
        return s;
    }

    public List<TdTipoEvento> getTiposEvento() {
        List<TdTipoEvento> tipos = new ArrayList<TdTipoEvento>();
        try {
            tipos.addAll(getTipoEventoService().consultarTodos());
        } catch (Exception e) {
        }
        return tipos;
    }

    public List<TbPublico> getListaPublicos() {
        List<TbPublico> publicos = null;
        try {
            publicos = getPublicoService().consultarTodos();
        } catch (Exception e) {
        }
        return publicos;
    }

    public List<TdTipoRecurso> getListaTiposRecursos() {
        List<TdTipoRecurso> tipos = null;
        try {
            tipos = getTipoRecursoService().consultarTodos();
        } catch (Exception e) {
        }
        return tipos;
    }
    // Util    

    public void model() {
        
        try {
            // Inicializando o model de evento
            evento.setTdTipoEvento(new TdTipoEvento());
            evento.setTbAtividades(new HashSet<TbAtividade>());
            
            // Carregando os recursos disponiveis
            recursosDisponiveis = getRecursoService().consultarTodos();
            
            // Carregando os servicos disponiveis
            servicosDisponiveis = getServicoService().consultarTodos();
        } catch (Exception ex) {
        }

    }

}
